Одной из проблем возникающих в многопоточной среде является доступ к некоторым переменным. Сразу сказу, что тоже самое можно решить используя lock. Типа:
lock(x)
{
x=x+1;
}
Но С# позволяет решить задачу увеличения или уменьшения значения переменной легче. Смотрим код:
using System;
using System.Threading;
class MainClass
{
public static int x;
public static void Main(string[] args)
{
x=0;
Thread thread1 = new Thread(new ThreadStart(Proc1));
Thread thread2 = new Thread(new ThreadStart(Proc2));
thread1.Start();
thread2.Start();
}
public static void Proc1()
{
Interlocked.Increment( ref x );
Console.WriteLine(x);
for (int i=1;i<1000000000;i++) ;
Interlocked.Decrement( ref x );
Console.WriteLine("Proc1");
Console.WriteLine(x);
}
public static void Proc2()
{
Interlocked.Increment( ref x );
Console.WriteLine(x);
for (int i=1;i<1000000000;i++) ;
Interlocked.Decrement( ref x );
Console.WriteLine("Proc2");
Console.WriteLine(x);
}
}
Итак, у нас есть класс Interlocked который имеет в своем составе две нужный нам функции:
На самое главное, что при вызове этой функции переменная блокируется, и соответственно другие потоки не смогут это переменную изменить. Соответственно в момент блокировки другой поток не изменит и будет ждать, применение подобного метода гарантирует отсутствие конфликтов.
